package com.bt.controller.common;


import com.bt.result.Result;
import com.bt.vo.CommonVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * @Description 通用接口
 * @Author 张传康
 * @Date 2023-05-02 19:49
 */
@Api(tags = "通用接口")
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

    //加载yml文件内容注入到value变量里面
    @Value("${bt.onlineOrdering.imagesPath}")
    private String imagesPath;
    @Value("${bt.onlineOrdering.docPath}")
    private String docPath;
    @Value("${bt.onlineOrdering.videoPath}")
    private String videoPath;

    @ApiOperation("文件上传")
    @PostMapping("/upload")
    public Result<CommonVO> upload(String type, MultipartFile file) throws IOException {

        log.info("上传的文件是：{}，{}",
                (type.equals("images")) ? "图片" :
                        (type.equals("doc")) ? "文档" :
                                (type.equals("video")) ? "视频" : "唔知道啊！", file);

        //1.获取上传文件的文件名
        String filename = file.getOriginalFilename();
        //2.截取后缀名，再使用uuid作为文件名
        String extName = filename.substring(filename.lastIndexOf(".")); // .jpg
        //使用uuid+后缀名 = 新的文件名，防止文件名重名
        String uuidFileName = UUID.randomUUID().toString() + extName;
        CommonVO commonVO = new CommonVO();
        // 获取文件名称
        commonVO.setName(uuidFileName);

        // 文件大小
        Integer size = (int) file.getSize();
        commonVO.setSize(size);
        String url=null;
        // 判断上传的文件是 图片  文档  视频？
        if (type.equals("images")) {
            // 文件类型
            commonVO.setMime("image/"+filename.substring(filename.lastIndexOf(".")+1));
            // 是图片
            url = checkDir(file, imagesPath, uuidFileName);
        } else if (type.equals("doc")) {
            // 文件类型
            commonVO.setMime("doc/"+filename.substring(filename.lastIndexOf(".")+1));
            // 是文档
            url = checkDir(file, imagesPath, uuidFileName);
        }else if (type.equals("video")) {
            // 文件类型
            commonVO.setMime("video/"+filename.substring(filename.lastIndexOf(".")+1));
            // 是文档
            url = checkDir(file, imagesPath, uuidFileName);
        }

        commonVO.setSavePath(url);
        return Result.success(commonVO);
    }

    //检查存储文件目录是否存在,如果不存在需要创建
    private String checkDir(MultipartFile file, String path, String uuidFileName) throws IOException {

        File dir = new File(path);
        if (!dir.exists()) {
            //如果目标文件夹不存在则创建
            dir.mkdirs();
        }
        //4.把文件上传到指定路径下
        File destFile = new File(dir, uuidFileName);
        file.transferTo(destFile);  //文件拷贝

        String url = path+"/"+uuidFileName;
        String extName = url.substring(url.lastIndexOf(":")+1);
        url = "upload"+extName;
        return url;


    }


    /*@Autowired
    private AliOssUtil aliOssUtil;

    @ApiOperation("文件上传接口")
    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file){

        log.info("文件上传接口：{}",file);

        try {
            //获取原始文件名
            String originalFilename = file.getOriginalFilename();//xxxx.jpg

            //截取文件的扩展名
            String extName = originalFilename.substring(originalFilename.lastIndexOf("."));//.jpg

            //生成唯一文件名
            String fileName = UUID.randomUUID().toString().replace("-","")+extName;

            //调用阿里云文件上传工具类
            //  new AliOssUtil(xxxx,xxxx,xx,xx); 这种做法不推荐，因为每次上传都要new对象, 当前方法运行结束又销毁对象。累jvm
            //  优化：创建配置类，使用@Bean将其放入spring容器里面，其他地方使用直接注入
            String path = aliOssUtil.upload(file.getBytes(), fileName);

            return  Result.success(path);

        } catch (IOException e) {
            throw new BaseException(e.getMessage());
        }

    }*/
}
